經過前一篇的繼承方式說明後,今天我們要來做另外一隻怪物-骨頭魚,那這隻怪物只會說明追蹤主角的功能,因為它和尖刺怪的追蹤方式有較大的不同,其他的功能都大致相同,只有些微的差異,所以就不再多做介紹了,那我們就開始進入到骨頭魚追蹤主角功能吧!
一開始一樣要在骨頭魚身上加元件,骨頭魚和尖刺怪一樣都需要Rigidbody和Collider,不同的地方是骨頭魚不需要和地板做碰撞,但是又不希望它像自由落體一樣墜落到地圖外,所以我們要將Rigidbody的Body Type設定為Kinematic
,另外由於骨頭魚的外型比較接近長方形,因此選用BoxCollider,而且這個Collider的Is Trigger為false喔!
在進入到程式的之前,我先說明一下,尖刺怪和骨頭魚有些很不一樣的地方,尖刺怪的移動是取得Rigidbody元件並設定它的velocity值,但骨頭魚則是直接去設定transform.position值,而且尖刺怪在主角還未接近時都處在禁止的狀態,但骨頭魚會一直在水中游來游去,所以骨頭魚還有在腳本中多寫一個來回移動的程式。
那我們就開始寫程式囉,首先一樣是先設定變數,包括:
moveRange
,怪物可以移動的範圍posNow
,目前移動相對中點(初始位置)的位置centerPos
,可以移動區域的中心點moveSpeed
和trackSpeed
分別是來回移動的速度及追蹤中的移動速度Track Settings
,在尖刺怪有說明過,關於追蹤的變數設定設定完變數之後,我們要開始寫來回移動的功能,將這個功能放在MoveAround的函式裡面,如下圖。
Math.Clamp
是用來限制value的值在min和max之間,如下方程式,如果posNowX小於-moveRangeX,就會返回-moveRangeX,相反地,posNowX大於moveRangeX則返回moveRangeX。再來是追蹤主角設定,那跟尖刺怪一樣要先寫一個FindPlayer的函式,這部分和尖刺怪一樣都是用Physics2D.OverlapCircle
來尋找主角,在這邊就不多做介紹了。
接下來進入追蹤主角,我們需要寫一個Tracking函式
Math.Lerp
讓怪物去做線性移動,再來設定transform.postion的值。除了上方的設定之外,因為骨頭魚的移動總不可能一直面向右邊或左邊,所以我們還要調整骨頭魚的角度,讓整體的追蹤更加自然。
Mathf.Atan2
來判斷怪物指向主角連成的線,與x軸正方向之間的角度。transform.eulerAngles
進行怪物旋轉。接著就是在Update裡面去呼叫上方所寫的函式,當然要將所有的情況都考慮清楚才不會出現Bug喔,所以我在Update裡寫了很多的if else,判斷所有的狀態下應該進行什麼樣的動作,這地方要仔細想清楚,當然我也是經過玩家體驗之後發現的一些Bug,再去將原本沒考慮的情況加進去,相信多做練習就可以越來越熟練。
最後我們的骨頭魚就可以正常移動及追蹤主角囉!
以上就是骨頭魚的追蹤主角功能介紹,那我們Blue Remedy的怪物程式說明就到這裡結束,明天開始就會進入到場景的介紹了喔!